package br.ifrn.diacin.ctrlAula.integracao.dao;

import java.io.Serializable;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

@Stateless
public class GenericDAO implements GenericDAOLocal, GenericDAORemote {

	
	private EntityManager em;

	
	public GenericDAO() {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("CtrlAula");
		em = emf.createEntityManager();
	}

	@Override
	public <T> T pesquisarPorId(Class<T> entidadeClass, Serializable id) {
		return (T) em.find(entidadeClass, id);
	}

	@Override
	@SuppressWarnings("unchecked")
	public <T> List<T> listarTodos(Class<T> entidadeClass) {
		String query = "SELECT e FROM " + entidadeClass.getSimpleName() + " AS e";
		System.out.println("Processou a seguinte Query : "+query);
		return em.createQuery(query)
				.getResultList();
	}

	@Override
	@SuppressWarnings("unchecked")
	public <T> List<T> listarComRestricao(Class<T> entidadeClass,
			String restricao) {
		return em.createQuery(
				"SELECT e FROM " + entidadeClass.getSimpleName() + " AS e WHERE "
						+ restricao).getResultList();
	}

	@Override
	public <T> void salvar(T entidade) {
		em.getTransaction().begin();
		em.persist(entidade);
		em.getTransaction().commit();
	}

	@Override
	public <T> T atualizar(T entidade) {
		em.getTransaction().begin();
		T t = em.merge(entidade);
		em.getTransaction().commit();
		return t;
	}

	@Override
	public <T> void excluir(T entidade) {
		em.getTransaction().begin();
		entidade = em.merge(entidade);
		em.remove(entidade);
		em.getTransaction().commit();
	}

	@Override
	public <T> void excluirPorId(Class<T> entidadeClass, Serializable id) {
		em.getTransaction().begin();
		T entidade = pesquisarPorId(entidadeClass, id);
		em.remove(entidade);
		em.getTransaction().commit();
	}
	
	@Override
	public EntityManager getEm(){
		return em;
	}

}
